// File: jmcomic-core/src/main/java/dev/jukomu/jmcomic/entity/Triple.java
package dev.jukomu.jmcomic.entity;

import lombok.Data;

import java.util.Objects;

/**
 * 模拟Python中的三元组（Tuple with 3 elements）。
 *
 * @param <F> 第一个元素的类型
 * @param <S> 第二个元素的类型
 * @param <T> 第三个元素的类型
 */
@Data
public class Triple<F, S, T> {
    private final F first;
    private final S second;
    private final T third;

    public Triple(F first, S second, T third) {
        this.first = first;
        this.second = second;
        this.third = third;
    }

    public F getFirst() {
        return first;
    }

    public S getSecond() {
        return second;
    }

    public T getThird() {
        return third;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Triple<?, ?, ?> triple = (Triple<?, ?, ?>) o;
        return Objects.equals(first, triple.first) &&
                Objects.equals(second, triple.second) &&
                Objects.equals(third, triple.third);
    }

    @Override
    public int hashCode() {
        return Objects.hash(first, second, third);
    }

    @Override
    public String toString() {
        return "(" + first + ", " + second + ", " + third + ")";
    }

    /**
     * 静态工厂方法，方便创建Triple实例。
     *
     * @param first  第一个元素
     * @param second 第二个元素
     * @param third  第三个元素
     * @param <F>    第一个元素的类型
     * @param <S>    第二个元素的类型
     * @param <T>    第三个元素的类型
     * @return Triple实例
     */
    public static <F, S, T> Triple<F, S, T> of(F first, S second, T third) {
        return new Triple<>(first, second, third);
    }
}